package itheima03;
/*
    Lambda表达式的前提
        1.必须要有接口(函数式接口): 该接口中只能有一个抽象方法(必须要覆盖重写的抽象方法),
            可以有静态方法,可以有默认方法

        2.必须要有方法使用接口作为参数

        lambda表达式是对匿名内部类对象的简化书写格式

        @Override: 检测该方法是否是对父类方法的覆盖重写的
        @FunctionalInterface: 检测该接口是否是函数式接口的
 */
public class Demo03LambdaBase {
    public static void main(String[] args) {
        //1.匿名内部类对象的方式
        fun(new MyFunctionalInter() {
            @Override
            public void method() {
                System.out.println("A......");
            }
        });
        //2.lambda表达式的标准方式
        fun(()->{
            System.out.println("B...");
        });

        //3.lambda表达式的简化方式
        fun(()-> System.out.println("C..."));

    }
    /*
        定义方法,使用函数式接口MyFunctionalInter作为参数
        接口MyFunctionalInter作为参数: 调用时,可以传递实现类对象,匿名内部类对象,lambda表达式

        当方法被调用时: 左边是接口,右边是实现类对象  多态
        MyFunctionalInter mfi = new MyFunctionalInter() {
                                @Override
                                public void method() {
                                    System.out.println("A......");
                                }
                            };
        mfi.method();

     */
    public static void fun(MyFunctionalInter mfi) {
        //调用抽象方法
        mfi.method();
        //调用默认方法
        mfi.print();
        //调用静态方法
        MyFunctionalInter.show();
    }
}
